package com.example.proxytest.aop.aopxml;

import com.example.proxytest.aop.PersonService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/* ━━━━━━佛祖保佑━━━━━━
 *                  ,;,,;
 *                ,;;'(    社
 *      __      ,;;' ' \   会
 *   /'  '\'~~'~' \ /'\.)  主
 * ,;(      )    /  |.     义
 *,;' \    /-.,,(   ) \    码
 *     ) /       ) / )|    农
 *     ||        ||  \)
 *     (_\       (_\
 * ━━━━━━永无BUG━━━━━━
 * @author ：zjq
 * @date ：2020/9/7 16:05
 * @description: TODO  xml 形式
 * @version: V1.0
 * @slogan: 天下风云出我辈，一入代码岁月催
 */
public class Main {
    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        PersonService proxyPersonService = (PersonService) context.getBean("personService");
        String returnValue = proxyPersonService.savePerson();
        System.out.println(returnValue);

        /**
         * springAOP的具体加载步骤：
         *    1、当spring容器启动的时候，加载了spring的配置文件
         *    2、为配置文件中所有的bean创建对象
         *    3、spring容器在创建对象的时候它会解析aop:config的配置
         *        	    解析切入点表达式，用切入点表达式和纳入spring容器中的bean做匹配
         *             如果匹配成功，则会为该bean创建代理对象，代理对象的方法=目标方法+通知
         *             如果匹配不成功，则为该bean创建正常的对象
         * 	其实就是你通过表达式告诉Spring哪些bean需要它帮你生成代理对象而不是生成原有的正常对象
         *       理解这一点相当重要！
         *    4、在客户端利用context.getBean获取对象时，如果该对象有代理对象则返回代理对象，如果没有代理对象，则返回目标对象
         *
         * 说明：如果目标类没有实现接口，spring容器会采用cglib的方式产生代理对象，如果实现了接口，则会采用jdk的动态代理产生代理对象
         */


    }
}
